/**
 * 配对逻辑工具函数
 * 用于判断 tRNA 反密码子与 mRNA 密码子是否匹配，以及获取密码子对应的氨基酸
 */

// 定义密码子-反密码子配对规则
// 这是一个简化的规则，实际生物学配对规则更复杂（例如摆动效应）
const pairingRules: { [key: string]: string } = {
  'A': 'U',
  'U': 'A',
  'G': 'C',
  'C': 'G',
  // mRNA 使用 U，tRNA 使用 A，所以 tRNA 的反密码子 A 对 mRNA 的 U
  // mRNA 使用 A，tRNA 使用 U，所以 tRNA 的反密码子 U 对 mRNA 的 A
  // mRNA 使用 G，tRNA 使用 C，所以 tRNA 的反密码子 C 对 mRNA 的 G
  // mRNA 使用 C，tRNA 使用 G，所以 tRNA 的反密码子 G 对 mRNA 的 C
};

// 定义密码子到氨基酸的映射 (简化的遗传密码表)
const codonToAminoAcid: { [key: string]: string } = {
  'AUG': 'Met', // 甲硫氨酸 (起始密码子)
  'CGC': 'Arg', // 精氨酸
  'GUA': 'Val', // 缬氨酸
  'UAA': 'Stop', // 终止密码子
  'UAG': 'Stop', // 终止密码子
  'UGA': 'Stop', // 终止密码子
  'UUU': 'Phe', // 苯丙氨酸
  'UUC': 'Phe', // 苯丙氨酸
  'UUA': 'Leu', // 亮氨酸
  'UUG': 'Leu', // 亮氨酸
  // TODO: 添加完整的遗传密码表
};

/**
 * 检查反密码子是否与密码子匹配
 * @param anticodon tRNA 反密码子字符串 (例如: "UAC")
 * @param codon mRNA 密码子字符串 (例如: "AUG")
 * @returns boolean - 如果匹配则为 true，否则为 false
 */
export function checkMatch(anticodon: string, codon: string): boolean {
  if (anticodon.length !== 3 || codon.length !== 3) {
    console.warn('Invalid codon or anticodon length', anticodon, codon);
    return false;
  }

  // 按照碱基顺序逐个检查配对
  for (let i = 0; i < 3; i++) {
    const antiBase = anticodon[i].toUpperCase();
    const codonBase = codon[i].toUpperCase();

    // 检查配对规则
    if (pairingRules[codonBase] !== antiBase) {
      // 如果任一碱基不匹配，则整个密码子-反密码子不匹配
      return false;
    }
  }

  // 所有碱基都匹配，则配对成功
  return true;
}

/**
 * 根据密码子获取对应的氨基酸
 * @param codon mRNA 密码子字符串 (例如: "AUG")
 * @returns string | undefined - 对应的氨基酸缩写，如果密码子无效则为 undefined
 */
export function getAminoAcid(codon: string): string | undefined {
  return codonToAminoAcid[codon.toUpperCase()];
}

// TODO: 添加其他可能的工具函数 